<?php


$ffmpeg = 'K:\ffmpeg\bin\ffmpeg.exe';

$files = $_FILES;

// var_dump($files, $_POST);exit;

$regions = json_decode($_POST['regions'], true);
if (! $regions) {
    echo json_encode(['code'=>1, 'msg'=>"格式错误"]);
    exit;
}
$regions = arraySort($regions, 0);
// var_dump($regions);

//创建一个随机文件夹
$fileN = str_replace('\'', '_', $files['file']['name']);
$fileN = str_replace('`', '_', $fileN);
$fileN = str_replace(' ', '_', $fileN);
$randnum = $fileN . '_' . mt_rand(0, 9999);//var_dump($files['file']['tmp_name']);exit;
mkdir('temp/' . $randnum);

//拼接命令
$command = $ffmpeg . " -i ".$files['file']['tmp_name'];
foreach($regions as $key => $value) {
    $command .= ' -ss '.$value[0] . ' -t ' . $value[1] . ' -c copy ./temp/' . $randnum . '/' . $key . '.mp3 ';
}

//需要返回值
$command .= ' 2>&1';
// echo $command;exit;

//执行
exec($command, $result);
// var_dump($result);


//ZipArchive 准备制作压缩文件
$zip = new ZipArchive();
$zipName = 'temp/' .  $fileN . '.zip';
// 如果压缩文件不存在，就创建压缩文件
if (! is_file($zipName)) {
    $fp = fopen($zipName, 'w');
    fclose($fp);
}
// OVERWRITE选项表示每次压缩时都覆盖原有内容，但是如果没有那个压缩文件的话就会报错，所以事先要创建好压缩文件
// 也可以使用CREATE选项，此选项表示每次压缩时都是追加，不是覆盖，如果事先压缩文件不存在会自动创建
if ($zip->open($zipName, ZipArchive::OVERWRITE) === true) {
    $current = '/'; // 你要压缩的文件的主目录
    addFileToZip('temp/'.$randnum, $current, $zip);
    $zip->close();

    deldir('temp/'.$randnum.'/');
}else {
    echo json_encode(['code'=>1, 'msg'=>"压缩失败"]);
    exit;
}

echo json_encode(['code'=>0, 'msg'=>'/'.$zipName]);
// header("Cache-Control: public"); 
// header("Content-Description: File Transfer"); 
// header('Content-disposition: attachment; filename='.basename($zipName)); //文件名   
// header("Content-Type: application/zip"); //zip格式的   
// header("Content-Transfer-Encoding: binary"); //告诉浏览器，这是二进制文件    
// header('Content-Length: '. filesize($zipName)); //告诉浏览器，文件大小   
// @readfile($zipName);


//函数

function addFileToZip($path, $current, $zip) {
    // 打开文件夹资源
    $handler = opendir($path);
    // 循环读取文件夹内容
    while(($filename = readdir($handler)) !== false) {
        // 过滤掉Linux系统下的.和..文件夹
        if ($filename != '.' && $filename != '..') {
            // 文件指针当前位置指向的如果是文件夹，就递归压缩
            if (is_dir($path.'/'.$filename)) {
                $this->addFileToZip($path.'/'.$filename, $filename, $zip);
            }else {
                // 为了在压缩文件的同时也将文件夹压缩，可以设置第二个参数为文件夹/文件的形式，文件夹不存在自动创建压缩文件夹
                $zip->addFile($path.'/'.$filename, $current.'/'.$filename);
            }
        }
    }
    @closedir($handler);
}


function arraySort($array,$keys,$sort='asc') {
    $newArr = $valArr = array();
    foreach ($array as $key=>$value) {
        $valArr[$key] = $value[$keys];
    }
    ($sort == 'asc') ?  asort($valArr) : arsort($valArr);
    reset($valArr);
    foreach($valArr as $key=>$value) {
        $newArr[$key] = $array[$key];
    }
    return $newArr;
}


//清空文件夹函数和清空文件夹后删除空文件夹函数的处理
function deldir($path) {
    //如果是目录则继续
    if(is_dir($path)) {
        //扫描一个文件夹内的所有文件夹和文件并返回数组
        $p = scandir($path);
        foreach($p as $val){
            //排除目录中的.和..
            if($val !="." && $val !=".."){
                //如果是目录则递归子目录，继续操作
                if(is_dir($path.$val)){
                    //子目录中操作删除文件夹和文件
                    deldir($path.$val.'/');
                    //目录清空后删除空文件夹
                    @rmdir($path.$val.'/');
                }else{
                    //如果是文件直接删除
                    unlink($path.$val);
                }
            }
        }
        @rmdir($path.'/');
    }
}


// ffmpeg -i xxx.mp3 -ss 3 -t 2.5 -c copy output1.mp3 -ss 4 -t 5.5 -c copy output2.mp3 -ss 14 -t 12.5 -c copy output3.mp3
// ffmpeg -i xxx.mp3 -ss 19.10 -t 4.79 -c copy temp/9037/0.mp3 -ss 27.08 -t 0.58 -c copy temp/9037/3.mp3 -ss 32.50 -t 8.17 -c copy temp/9037/1.mp3 -ss 47.49 -t 8.85 -c copy temp/9037/2.mp3
// ffmpeg -i xxx.tmp -ss 30.13 -t 13.78 -c copy ./temp/5489/0.mp3